home *** CD-ROM | disk | FTP | other *** search
/ Aminet 26 / Aminet 26 (1998)(GTI - Schatztruhe)[!][Aug 1998].iso / XiPaint / Developer / Userport / xitest.c < prev    next >
C/C++ Source or Header  |  1995-01-13  |  8KB  |  274 lines

  1. /* Last Change: Mon Feb  7 14:43:04 1994 */
  2.  
  3. /****  Programm zum Testen von User-Messages an den XiUser-Port  ****/
  4.  
  5. /****  System-Includes  ****/
  6.  
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <string.h>
  10.  
  11. #include <exec/exec.h>
  12. #include <exec/types.h>
  13. #include <exec/memory.h>
  14. #include <exec/execbase.h>
  15. #include <exec/ports.h>
  16.  
  17. #include <clib/alib_protos.h>
  18.  
  19. #include <proto/exec.h>
  20. #include <proto/dos.h>
  21.  
  22.  
  23. /****  benötigte Strukturen und Kommandos  ****/
  24.  
  25. #include "XiUser.h"
  26.  
  27.  
  28. /****  Prototypes der verwendeten Funktionen  ****/
  29.  
  30. int main(int argc, char **argv);
  31.  
  32. void WaitReply(struct MsgPort *ReplyPort, struct Message *WaitMsg);
  33.  
  34.  
  35.  
  36.  
  37.  
  38. /****  Implementation  ****/
  39.  
  40. int main(int argc, char **argv)
  41.   {
  42.     struct MsgPort *XiUserPort, *XiReplyPort;
  43.     struct XiMessage XiMsg;
  44.     char ProjName[100];
  45.     ULONG *PaintMem;
  46.     short i, j, Width, Height;
  47.  
  48. /**  Finden des User-Ports  **/
  49.  
  50.     if ( (XiUserPort = FindPort((UBYTE *)"xiuser.port")) == NULL )
  51.       {
  52.     printf(" User-Port nicht gefunden, läuft XiPaint überhaupt ???\n");
  53.     exit(40);
  54.       }
  55.  
  56. /**  einen Reply-Port einrichten  **/
  57.  
  58.     if ( (XiReplyPort = CreatePort(NULL, 0)) == NULL )
  59.       {
  60.     printf(" Konnte den Reply-Port nicht einrichten !!\n");
  61.     exit(40);
  62.       }
  63.  
  64. /**  Initialisieren der Message (kann nach Reply wiederverwendet werden)  **/
  65.  
  66.     memset(&XiMsg, 0, sizeof(struct XiMessage));
  67.  
  68.     XiMsg.ExecMess.mn_Node.ln_Type = NT_MESSAGE;
  69.     XiMsg.ExecMess.mn_Node.ln_Pri = 0;
  70.     XiMsg.ExecMess.mn_Length = sizeof(struct XiMessage);
  71.     XiMsg.ExecMess.mn_ReplyPort = XiReplyPort;
  72.     XiMsg.Label = 0x12345678;                /* Erkennungsmarke für XiPaint, sehr wichtig !!!! */
  73.  
  74. /**  erster Test -> holen der Projekt-Liste  **/
  75.  
  76.     XiMsg.Command = XI_GET_PROJECT_LIST;            /* Kommando ausfüllen */
  77.  
  78.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  79.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);        /* Warten auf Reply, siehe Fkt. unten */
  80.  
  81.     if ( XiMsg.Success == TRUE )             /* Aktion war erfolgreich */
  82.       {
  83.     for(i=0; i<XiMsg.ProjectCount; i++)                /* Auswerten der Liste */
  84.         printf(" Projekt %d:  '%s'\n", i, XiMsg.ProjectList[i]);
  85.  
  86.     /* Achtung: keine Gewähr auf Gültigkeit der Liste für lange Zeit, Fenster können schon zu sein... */
  87.  
  88.     strcpy(ProjName, XiMsg.ProjectList[0]);                /* Merken eines Projekts */
  89.  
  90.     /* Achtung: Listenspeicher muß hier freigegeben werden */
  91.     FreeVec(XiMsg.ProjectList);
  92.       }
  93.     else
  94.       {
  95.     printf(" Kein Projekt gefunden -> Ende !!\n");
  96.     exit(0);
  97.       }
  98.  
  99.     printf("\n Taste für weiter...");
  100.     getch();
  101.     printf("\n");
  102.  
  103. /**  Sperren eines Projekts  **/
  104.  
  105.     XiMsg.Command = XI_LOCK_PROJECT;                /* Kommando ausfüllen */
  106.     XiMsg.ProjectName = ProjName;                /* Name des Projekts */
  107.  
  108.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  109.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);        /* Warten auf Reply, siehe Fkt. unten */
  110.  
  111.     if ( XiMsg.Success == TRUE )             /* Aktion war erfolgreich */
  112.       {
  113.     PaintMem = (ULONG *)XiMsg.Memory;                /* Auswerten der Rückgabewerte */
  114.     Width = XiMsg.Width;
  115.     Height = XiMsg.Height;
  116.  
  117.     printf("Projekt '%s' gesperrt,  Größe  %d x %d\n", ProjName, Width, Height);
  118.  
  119.     for(j=20; j<40; j++)                /* Zeichnen eines Lila Rechteckes -> Test */
  120.       {
  121.         for(i=30; i<60; i++)
  122.           {
  123.         *(PaintMem + j * Width + i ) = 0xFF00FF00;
  124.           }
  125.       }
  126.  
  127.     /* nach Manipulation muß noch die Anzeige upgedatet werden */
  128.  
  129.     XiMsg.Command = XI_UPDATE_PROJECT;            /* Kommando ausfüllen */
  130.     XiMsg.ProjectName = ProjName;                /* Name des Projekts */
  131.  
  132.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  133.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);    /* Warten auf Reply, siehe Fkt. unten, Erfolgscheck nicht notwendig */
  134.       }
  135.     else
  136.       {
  137.     printf(" Konnte Projekt '%s' nicht sperren -> Ende !!\n", ProjName);
  138.     exit(0);
  139.       }
  140.  
  141.     printf("\n Taste für weiter...");
  142.     getch();
  143.     printf("\n");
  144.  
  145. /**  Freigeben des Projekts  **/
  146.  
  147.     XiMsg.Command = XI_UNLOCK_PROJECT;                /* Kommando ausfüllen */
  148.     XiMsg.ProjectName = ProjName;                /* Name des Projekts */
  149.  
  150.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  151.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);        /* Warten auf Reply, siehe Fkt. unten */
  152.  
  153.     if ( XiMsg.Success == TRUE )             /* Aktion war erfolgreich (sollte immer sein...) */
  154.       {
  155.     printf(" Projekt '%s' freigegeben\n", ProjName);
  156.       }
  157.     else
  158.       {
  159.     printf(" Konnte Projekt '%s' nicht freigeben, schwerer Fehler !!\n", ProjName);
  160.     exit(40);
  161.       }
  162.  
  163.     printf("\n Taste für weiter...");
  164.     getch();
  165.     printf("\n");
  166.  
  167. /**  Erzeugen eines neuen Projekts  **/
  168.  
  169.  /****  ACHTUNG !!! XiPaint setzt statt den 4 Underscores eine eindeutige Kennung ein (ändert damit den Inhalt    ****/
  170.  /****            der übergebenen Variable) !!                                        ****/
  171.  /****  Sie müssen daher im Namen des zu erzeugenden Projekts vorne freigelassen werden !                      ****/
  172.  /****  Weiters müssen Sie sicherstellen, daß der nach dem Öffnen geänderte Namen auch verwendet wird !     ****/
  173.  /****  Hier im Bsp. wird der Inhalt der "ProjName"-Variable geändert, die Veränderungen werden autom. übernommen  ****/
  174.  
  175.     strcpy(ProjName, "____AdPro-Fenster");            /* Puffer initialisieren */
  176.  
  177.     XiMsg.Command = XI_NEW_PROJECT;                /* Kommando ausfüllen */
  178.  
  179.     XiMsg.ProjectName = ProjName;                /* Name des Projekts */
  180.  
  181.     XiMsg.Width = 200;                        /* Größe des Projekts */
  182.     XiMsg.Height = 200;
  183.  
  184.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  185.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);        /* Warten auf Reply, siehe Fkt. unten */
  186.  
  187.     if ( XiMsg.Success == TRUE )             /* Aktion war erfolgreich */
  188.       {
  189.     PaintMem = (ULONG *)XiMsg.Memory;                /* Auswerten der Rückgabewerte */
  190.     Width = XiMsg.Width;            /* Wichtig: Größe kann sich geändert haben (größer geworden) */
  191.     Height = XiMsg.Height;            /* daher ist ein Übernehem der neuen Größe unbedingt erforderlich !! */
  192.  
  193.     printf("Projekt '%s' erzeugt,  Größe  %d x %d\n", ProjName, Width, Height);
  194.  
  195.     for(j=50; j<150; j++)                /* Zeichnen eines grünen Rechteckes -> Test */
  196.       {
  197.         for(i=50; i<150; i++)
  198.           {
  199.         *(PaintMem + j * Width + i ) = 0x00FF0000;
  200.           }
  201.       }
  202.  
  203.     /* nach Manipulation muß noch die Anzeige upgedatet werden */
  204.  
  205.     XiMsg.Command = XI_UPDATE_PROJECT;            /* Kommando ausfüllen */
  206.     XiMsg.ProjectName = ProjName;                /* ProjName-Variable durch Open-Call auf Namen mit Kennung geändert  !!!! */
  207.  
  208.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  209.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);    /* Warten auf Reply, siehe Fkt. unten, Erfolgscheck nicht notwendig */
  210.       }
  211.     else
  212.       {
  213.     printf(" Konnte Projekt '%s' nicht erzeugen -> Ende !!\n", ProjName);
  214.     exit(0);
  215.       }
  216.  
  217.     printf("\n Taste für weiter...");
  218.     getch();
  219.     printf("\n");
  220.  
  221. /**  Freigeben des erzeugten Projekts  **/
  222.  
  223.     XiMsg.Command = XI_UNLOCK_PROJECT;                /* Kommando ausfüllen */
  224.     XiMsg.ProjectName = ProjName;                /* Name des Projekts */
  225.  
  226.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  227.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);        /* Warten auf Reply, siehe Fkt. unten */
  228.  
  229.     if ( XiMsg.Success == TRUE )             /* Aktion war erfolgreich (sollte immer sein...) */
  230.       {
  231.     printf(" Projekt '%s' freigegeben\n", ProjName);
  232.       }
  233.     else
  234.       {
  235.     printf(" Konnte Projekt '%s' nicht freigeben, schwerer Fehler !!\n", ProjName);
  236.     exit(40);
  237.       }
  238.  
  239.     printf("\n Taste für weiter...");
  240.     getch();
  241.     printf("\n");
  242.  
  243. /**  Aufräumen und Ende  **/
  244.  
  245.     DeletePort(XiReplyPort);
  246.     exit(0);
  247.   }
  248.  
  249.  
  250.  
  251. /************
  252.  
  253.   Funktion wartet solange, bis die gesendete Message "WaitMsg" von an den
  254.   Reply-Port zurückgekommen ist
  255.  
  256. ************/
  257.  
  258. void WaitReply(struct MsgPort *ReplyPort, struct Message *WaitMsg)
  259.   {
  260.     struct Message *OkMsg;
  261.     BOOL Loop=TRUE;
  262.  
  263.     while(Loop)
  264.       {
  265.     WaitPort(ReplyPort);
  266.  
  267.     while( OkMsg = GetMsg(ReplyPort) )
  268.       {
  269.         if ( OkMsg == WaitMsg )
  270.             Loop = FALSE;
  271.       }
  272.       }
  273.   }
  274.